/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package dao;

import entidades.PersonaContraste;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import serviceEntities.Cliente;
import serviceEntities.Contraste;
import serviceEntities.Zona;

/**
 *
 * @author RENZO
 */
public class ContrasteDAO extends AbstractDAO {
    
    public static Boolean registrarProgramacion(){
        Boolean rpta = false;
        PreparedStatement psMedidor = null;
//        try {
//            Date fechaActual = new Date();
//            SimpleDateFormat formato = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
//            String fecActual = formato.format(fechaActual);
//            psMedidor = prepararConexionPrepared("UPDATE Medidor SET medidor_fec_contrast = '"+fecActual+"' WHERE medidor_id = ?");
//            psMedidor.setLong(1, objMedidor.getId());
//            rpta = realizarConexionPOST(psMedidor);
//            
//        } catch (SQLException ex) {
//            Logger.getLogger(UsuarioDAO.class.getName()).log(Level.SEVERE, null, ex);
//        }finally{
//            try {
//                psMedidor.close();
//                dataAccess.closeConnection();
//            } catch (SQLException ex) {
//                Logger.getLogger(UsuarioDAO.class.getName()).log(Level.SEVERE, null, ex);
//            }
//        }
        return rpta;
    }
    
    public static List<Zona> getSincronizacion(long usuarioId) throws Exception,SQLException,ParseException{
        List<Zona>listaZonas = new ArrayList<Zona>();
        PreparedStatement ps = null;
        Zona objZona = null;
        List<Contraste>listaContrastes = new ArrayList<Contraste>();
        Contraste objContraste = null;
        Cliente objCliente = null;
        serviceEntities.Medidor objMedidor = null;
        try {
            ps = prepararConexionCall(" SELECT * from data_sincronizacion where usuario = "+ String.valueOf(usuarioId));
            ResultSet rs = realizarConexionGET(ps);
            long zona_temp = 0;
            while(rs.next()){
                SimpleDateFormat formatoDelTexto = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
                String strFechaAviso = rs.getString("fechaaviso"); 
                String strFechaProgramada = rs.getString("fechaprogramada");
                Date fechaAviso = null;
                Date fechaProgramada = null;
                try {
                fechaAviso = formatoDelTexto.parse(strFechaAviso);
                fechaProgramada = formatoDelTexto.parse(strFechaProgramada);

                } catch (ParseException ex) {
                    throw ex;
                }
                if(zona_temp == rs.getLong("zonaid") || zona_temp == 0){
                    //La iteracion es de la misma zona, no ha cambiado; o es la 1ra
                    objMedidor = new serviceEntities.Medidor(rs.getString("suministro"), rs.getString("serie"), rs.getString("marca"), rs.getString("modelo"), rs.getString("tipomedidor"), rs.getString("ano"));
                    objCliente = new Cliente(rs.getString("nombres"), rs.getString("direccion"), objMedidor);
                    objContraste = new Contraste(rs.getString("id"), fechaAviso.getTime(), fechaProgramada.getTime(), rs.getString("tipo"), rs.getString("reporte"), objCliente);
                    listaContrastes.add(objContraste);
                    objZona = new Zona(rs.getString("nombrezona"), rs.getString("abreviaturazona"), listaContrastes);
                }else{
                    //La iteracion es de una zona diferente a la anterior (empieza a venir data de otra zona)
                    //entonces se instanciara otra zona para agregarla a la lista de zonas
                    objZona.setContrastes(listaContrastes);
                    listaZonas.add(objZona);
                    listaContrastes = new ArrayList<Contraste>();
                    //de aqui hace lo mismo que la condicion de arriba
                    objMedidor = new serviceEntities.Medidor(rs.getString("suministro"), rs.getString("serie"), rs.getString("marca"), rs.getString("modelo"), rs.getString("tipomedidor"), rs.getString("ano"));
                    objCliente = new Cliente(rs.getString("nombres"), rs.getString("direccion"), objMedidor);
                    objContraste = new Contraste(rs.getString("id"), fechaAviso.getTime(), fechaProgramada.getTime(), rs.getString("tipo"), rs.getString("reporte"), objCliente);
                    listaContrastes.add(objContraste);
                    objZona = new Zona(rs.getString("nombrezona"), rs.getString("abreviaturazona"), listaContrastes);
                }
                zona_temp = rs.getLong("zonaid");
            }
            listaZonas.add(objZona);//se graba el ultimo objZona pues no se acumula en el while
        } catch (SQLException ex) {
            throw ex;
        }finally{
            try {
                ps.close();
                dataAccess.closeConnection();
            } catch (SQLException ex) {
                throw ex;
            }
        }
        return listaZonas;
    }
    
    public static Boolean registrarContraste(entidades.Medidor objMedidor,long userId){
        Boolean rpta = false;
        PreparedStatement psEnsayo = null;
        PreparedStatement psResultado = null;
        PreparedStatement psMedidor = null;
        try {
            Date fechaActual = new Date();
            SimpleDateFormat formato = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
            String fecActual = formato.format(fechaActual);
            psMedidor = prepararConexionPrepared("UPDATE Medidor SET medidor_fec_contrast = '"+fecActual+"' WHERE medidor_id = ?");
            psMedidor.setLong(1, objMedidor.getId());
            rpta = realizarConexionPOST(psMedidor);
            psResultado = prepararConexionPrepared("INSERT INTO Resultado (medidor_id,usuario_id,resultado_estado, contraste_id,resultado_comentario,resultado_fecre,resultado_pruebavacio,resultado_aprueba,"
                                                 + "resultado_apreciacion,resultado_lectura,resultado_voltaje,gps_coordenada_x,gps_coordenada_y,resultado_consumo,resultado_precinto) "
                                                 + "VALUES ("+objMedidor.getId()+","+userId+","+objMedidor.getContraste().getResultado().getEstado()+
                                                    ","+objMedidor.getContraste().getId()+",'"+objMedidor.getContraste().getResultado().getComentario()+
                                                    "','"+fecActual+"','"+objMedidor.getContraste().getResultado().getPruebaVacio()+"','"+objMedidor.getContraste().getResultado().getApueba()+
                                                    "','"+objMedidor.getContraste().getResultado().getApreciacion()+"','"+objMedidor.getContraste().getResultado().getLectura()+
                                                    "','"+objMedidor.getContraste().getResultado().getVoltaje()+"',"+objMedidor.getContraste().getResultado().getGpsCoordenadaX()+
                                                    ","+objMedidor.getContraste().getResultado().getGpsCoordenadaY()+",'"+objMedidor.getContraste().getResultado().getLectura()+"','"+objMedidor.getContraste().getResultado().getPrecinto()+"')");
            rpta = realizarConexionPOST(psResultado);
            long resultadoId = 0;
            psResultado.close();
            psResultado = prepararConexionPrepared("SELECT MAX(resultado_id) FROM Resultado WHERE contraste_id = "+objMedidor.getContraste().getId());
            ResultSet rs = psResultado.executeQuery();
            if(rs.next()){
                resultadoId = rs.getLong(1);
            }
            rs.close();
            //insertado para obtener el cliente_id
            
            long clienteId = 0;
            psResultado.close();
            psResultado = prepararConexionPrepared("SELECT cliente_id FROM Medidor WHERE medidor_id = "+objMedidor.getId());
            ResultSet rsC = psResultado.executeQuery();
            if(rsC.next()){
                clienteId = rsC.getLong(1);
            }
            rsC.close();
            //************************************
            
            //insertado para registrar personacontraste
            psResultado.close();
            psResultado = prepararConexionPrepared("SELECT grupo_id FROM programacion WHERE contraste_id = "+objMedidor.getContraste().getId());
            ResultSet rsP = psResultado.executeQuery();
            long grupo_id=0;
            if(rsP.next()){
                grupo_id = rsP.getLong(1);
            }
            PersonaContraste pc = new PersonaContraste(grupo_id,clienteId,resultadoId);
            rsP.close();
            
            psResultado = prepararConexionPrepared("INSERT INTO PERSONACONTRASTE (grupo_id,cliente_id,resultado_id) VALUES ("+pc.getGrupoId()+","+pc.getClienteId()+","+pc.getResultadoId()+")");
            rpta = realizarConexionPOST(psResultado);
            
            //******************************************
            
            short t = 1;//nro de ensayo siempre sera 1 por defecto
            
            psEnsayo = prepararConexionPrepared("INSERT INTO Ensayo (resultado_id,ensayo_5,ensayo_10,ensayo_100,ensayo_imax,ensayo_numero) "
                                                 + "VALUES ("+resultadoId+","+objMedidor.getContraste().getResultado().getEnsayo().getEnsayo5()+","+objMedidor.getContraste().getResultado().getEnsayo().getEnsayo10()+
                                                    ","+objMedidor.getContraste().getResultado().getEnsayo().getEnsayo100()+","+ objMedidor.getContraste().getResultado().getEnsayo().getEnsayoImax()+","+t+")");
            rpta = realizarConexionPOST(psEnsayo);
            
        } catch (SQLException ex) {
            Logger.getLogger(UsuarioDAO.class.getName()).log(Level.SEVERE, null, ex);
        }finally{
            try {
                psEnsayo.close();
                psResultado.close();
                psMedidor.close();
                dataAccess.closeConnection();
            } catch (SQLException ex) {
                Logger.getLogger(UsuarioDAO.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        return rpta;
    }
    
    public static Boolean registrarContrasteImpedimento(entidades.Medidor objMedidor,long userId){
        Boolean rpta = false;
        PreparedStatement psEnsayo = null;
        PreparedStatement psResultado = null;
        PreparedStatement psMedidor = null;
        try {
            Date fechaActual = new Date();
            SimpleDateFormat formato = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
            String fecActual = formato.format(fechaActual);
            psMedidor = prepararConexionPrepared("UPDATE Medidor SET medidor_fec_contrast = '"+fecActual+"' WHERE medidor_id = ?");
            psMedidor.setLong(1, objMedidor.getId());
            rpta = realizarConexionPOST(psMedidor);
            if(rpta){
                psResultado = prepararConexionPrepared("INSERT INTO Resultado (medidor_id,usuario_id,resultado_estado, contraste_id,resultado_comentario,resultado_fecre) "
                                                 + "VALUES ("+objMedidor.getId()+","+userId+","+ objMedidor.getContraste().getResultado().getEstado()+","+objMedidor.getContraste().getId()+
                                                    ",'"+objMedidor.getContraste().getResultado().getComentario()+"','"+fecActual+"')");
                rpta = realizarConexionPOST(psResultado);
            }
            //resultado_id
             long resultadoId = 0;
            psResultado.close();
            psResultado = prepararConexionPrepared("SELECT MAX(resultado_id) FROM Resultado WHERE contraste_id = "+objMedidor.getContraste().getId());
            ResultSet rs = psResultado.executeQuery();
            if(rs.next()){
                resultadoId = rs.getLong(1);
            }
            //************************************
            
            //insertado para obtener el cliente_id
            long clienteId = 0;
            psResultado.close();
            psResultado = prepararConexionPrepared("SELECT cliente_id FROM Medidor WHERE medidor_id = "+objMedidor.getId());
            ResultSet rsC = psResultado.executeQuery();
            if(rsC.next()){
                clienteId = rsC.getLong(1);
            }
            rsC.close();
            //************************************
            
            //grupo
            psResultado.close();
            psResultado = prepararConexionPrepared("SELECT grupo_id FROM programacion WHERE contraste_id = "+objMedidor.getContraste().getId());
            ResultSet rsP = psResultado.executeQuery();
            long grupo_id=0;
            if(rsP.next()){
                grupo_id = rsP.getLong(1);
            }
            PersonaContraste pc = new PersonaContraste(grupo_id,clienteId,resultadoId);
            rsP.close();
            //*************************************
            
            psResultado = prepararConexionPrepared("INSERT INTO PERSONACONTRASTE (grupo_id,cliente_id,resultado_id) VALUES ("+pc.getGrupoId()+","+pc.getClienteId()+","+pc.getResultadoId()+")");
            rpta = realizarConexionPOST(psResultado);
        } catch (SQLException ex) {
            Logger.getLogger(UsuarioDAO.class.getName()).log(Level.SEVERE, null, ex);
        }finally{
            try {
                psResultado.close();
                psMedidor.close();
                dataAccess.closeConnection();
            } catch (SQLException ex) {
                Logger.getLogger(UsuarioDAO.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        return rpta;
    }
}
